package com.sky.demo;

/**
 * ThreadLocal演示
 *
 * @Author Vsunks.v
 * @Date 2023/4/29 11:41
 * @Blog blog.sunxiaowei.net/996.mba
 * @Description: ThreadLocal演示
 */
public class ThreadLocalDemo {

    // 0. 定义一个线程容器对象
    public static ThreadLocal<String> tl = new ThreadLocal<>();

    public static void main(String[] args) {
        /*
            效果：
                在一个方法中设置参数，不通过传统传参的方式，在另外一个方法中也可以获取的该参数

            想实现效果，有两个要求：
                1. 多次方法调用是在同一个线程中
                2. 使用的也是同一个线程容器对象（ThreadLocal）

            使用：
                1. 创建唯一的一个ThreadLocal对象(，其泛型为容器将要存储的数据类型)。
                2. 在想要共享的位置，使用该对象.set(值)；
                3. 在想要使用的位置，使用该对象.get()；

            注意：
                只需要保证是在同一线程中即可，与是否在同一个类中无关

         */
        String arg = "登登";


        // 不通过传参的方式，在其他方法 test1()中也可以使用arg的值
        System.out.println("0:" + Thread.currentThread().getName());

        // 1. 为当前线程的容器对象，存入一个值
        tl.set(arg);
        test1();

    }

    private static void test1() {
        System.out.println("1:" + Thread.currentThread().getName());
        // 3. 在同一个线程调用的其他方法中，使用同一个ThreadLocal对象获取共享的数据
        String xxx = tl.get();
        System.out.println("test1:" + xxx);

        // 5. 在main线程范围内，调用NewClass.test2方法
        NewClass.test2();
    }
}


class NewClass {
    public static void test2() {
        System.out.println("2:" + Thread.currentThread().getName());

        // 4. 在(不同类中)同一个线程调用的其他方法中，使用同一个ThreadLocal对象获取共享的数据
        String yyyy = ThreadLocalDemo.tl.get();
        System.out.println("NewClass:test2" + yyyy);

    }
}
